
import java.util.Date;
import java.text.SimpleDateFormat;

class UnidadeConcedenteController {

    def springSecurityService;
    ConvenioService convenioService;


    /*
     * Se a url vier sem action redireciona para a create.
     */
    def index  = {
        if(!verificaLogon()){
            return;
        }
        UnidadeConcedente unidadeConcedenteInstance = UnidadeConcedente.findById(session.pessoa.id);
        def enderecoInstance          = Endereco.findAllByPessoa(session.pessoa)
        def contatoInstance           = Contato.findAllByPessoa(session.pessoa)
        Colaborador colaborador       = Colaborador.findById(session.pessoa.id);
        def responsavelInstance       = Responsavel.findAllByColaborador(colaborador);
        def convenioInstance          = Convenio.findByColaborador(colaborador);
        def vagaInstance              = Vaga.executeQuery("SELECT va FROM Vaga va WHERE va.qtdeVagas > 0 AND va.status = 1 AND va.unidadeConcedente.id = ? ORDER BY va.dtCadastro DESC LIMIT 5",[unidadeConcedenteInstance.id]);
        def envioVagaInstance         = EnvioVaga.executeQuery("SELECT DISTINCT ev FROM EnvioVaga ev, Vaga va, UnidadeConcedente uc, Solicitacao so WHERE ev.vaga.id = va.id AND va.id <> so.vaga.id AND va.unidadeConcedente.id = uc.id AND uc.id = ?",[unidadeConcedenteInstance.id]);

        render(view:"index", model:[unidadeConcedenteInstance : unidadeConcedenteInstance,
                                    enderecoInstance    : enderecoInstance,
                                    contatoInstance     : contatoInstance,
                                    responsavelInstance : responsavelInstance,
                                    convenioInstance    : convenioInstance,
                                    vagaInstance        : vagaInstance,
                                    envioVagaList       : envioVagaInstance]);
    };


    /*
     * Closure que lista as empresas cadastradas.
     */
    def list   = {
        if(!verificaLogon()){
            return;
        }
        params.max = Math.min(params.max ? params.int('max') : 10, 100);
        
        def uc = UnidadeConcedente.createCriteria()
        def results = uc.list {  
            if (params.nome) {
                or {
                    like("nome","%" + params.nome + "%") 
                    like("razaoSocial","%" + params.nome + "%")}}
            if (params.id) {eq("id",Long.valueOf(params.id))}
            if (params.cpf) {eq("cnpjCpf",params.cpf)}
            
            if (params.max) {maxResults(params.max)}
            if (params.sort) {order(params.sort,params.order)}        
        }
        
        [unidadeConcedenteInstanceList: results, unidadeConcedenteInstanceTotal: UnidadeConcedente.count()]
    }

    /*
     * Closure que carrega a tela de cadastro.
     */
    def create = {
        def unidadeConcedenteInstance = new UnidadeConcedente();
        unidadeConcedenteInstance.properties = params;
        return [unidadeConcedenteInstance: unidadeConcedenteInstance];
    }

    /*
     * Closure que grava o registro.
     * Seta a session pessoa e envia para a tela de edição do cadastro para que o usuário possa concluir o cadastro.
     */
    def save   = {
        Date hoje = new Date();
        SimpleDateFormat formatador  = new SimpleDateFormat('dd/MM/yyyy hh:MM:ss');

        def unidadeConcedenteInstance = new UnidadeConcedente(params);
        unidadeConcedenteInstance.password = springSecurityService.encodePassword(params.password)
        unidadeConcedenteInstance.dtCadastro = Date.parse('dd/MM/yyyy hh:MM:ss',formatador.format(hoje));
        if (unidadeConcedenteInstance.save(flush: true)) {
            session.pessoa = unidadeConcedenteInstance;
            flash.message="Unidade Concedente cadastrada com sucesso.";
            redirect(action: "edit");
        }else {
            render(view:"create",model: [unidadeConcedenteInstance: unidadeConcedenteInstance]);
        }
    };

    /*
     * Closure que carrega os dados e exibe um preview.
     */
    def show   = {
        if(!verificaLogon()){
            return;
        }
        def unidadeConcedenteInstance = UnidadeConcedente.get(params.id);
        if (!unidadeConcedenteInstance) {
            redirect(action: "list");
        }
        else {
            [unidadeConcedenteInstance: unidadeConcedenteInstance];
        }
    };


    /*
     * Closure que carregado os dados da Instituição de Ensino para alteração.
     * Lista os Convênios, Responsáveis, endereços e contatos.
     * Em caso de alteração de um dado dos tipos listados acima, carrega os dados do registro.
     */
    def edit   = {
        if(!verificaLogon()){
            return;
        }
        int totalEndereco    = 0;
        int totalContato     = 0;
        int totalResponsavel = 0;
        Colaborador colaboradorInstance = Colaborador.findById(session.pessoa.id);

        // Carrega os dados da Unidade Concedente(Empresa).
        def unidadeConcedenteInstance = UnidadeConcedente.findById(colaboradorInstance.id);
        if (!unidadeConcedenteInstance){
            unidadeConcedenteInstance   = new UnidadeConcedente();
        }

        // RESPONSÁVEL.
        // Carrega os dados para a alteração do responsável.
        def responsavelDadosInstance = '';
        if(params.responsavel != null){
            responsavelDadosInstance = Responsavel.findById(params.responsavel);
        }else{
            responsavelDadosInstance = new Responsavel();
        }
        // Carrega os responsáveis cadastrados.
        def responsavelInstance   = Responsavel.findAllByColaborador(session.pessoa);
        if (responsavelInstance != null){
            totalResponsavel = responsavelInstance.count();
        }else{
            responsavelInstance   = new Responsavel();
        }

        // ENDEREÇOS.
        // Carrega os dados para a alteração do endereço.
        def enderecoDadosInstance = '';
        if(params.endereco != null){
            enderecoDadosInstance = Endereco.findById(params.endereco);
        }else{
            enderecoDadosInstance = new Endereco();
        }
        // Carrega os endereços cadastrados.
        def enderecoInstance   = Endereco.findAllByPessoa(session.pessoa);
        if (enderecoInstance != null){
            totalEndereco = enderecoInstance.count();
        }else{
            enderecoInstance   = new Endereco();
        }

        // CONTATOS.
        // Carrega os dados para a alteração do contato.
        def contatoDadosInstance = '';
        if(params.contato != null){
            contatoDadosInstance = Contato.findById(params.contato);
        }else{
            contatoDadosInstance = new Contato();
        }
        // Carrega os contados cadastrados.
        def contatoInstance = Contato.findAllByPessoa(session.pessoa);
        if (contatoInstance != null){
            totalContato = contatoInstance.count();
        }else{
            contatoInstance    = new Contato();
        }
        if (unidadeConcedenteInstance){
            // Avisa que não tem convênio.
            if (!convenioService.possuiConvenioAtivo(colaboradorInstance)) {
                flash.message = "Você não possui convênio. <a href='#'>Solicitar convênio</a>";
            }
            return [unidadeConcedenteInstance : unidadeConcedenteInstance,
                    responsavelInstance       : responsavelDadosInstance,
                    responsavelInstanceList   : responsavelInstance,
                    responsavelInstanceTotal  : totalResponsavel,
                    enderecoInstance          : enderecoDadosInstance,
                    enderecoInstanceList      : enderecoInstance,
                    enderecoInstanceTotal     : totalEndereco,
                    contatoInstance           : contatoDadosInstance,
                    contatoInstanceList       : contatoInstance,
                    contatoInstanceTotal      : totalContato];
        }else {
            flash.message="Unidade Concedente não encontrada.";
            redirect(action: "create");
        }
    };


    def update   = {
        if(!verificaLogon()){
            return;
        }
        def unidadeConcedenteInstance = UnidadeConcedente.get(params.id);
        unidadeConcedenteInstance.password = springSecurityService.encodePassword(params.password);
        unidadeConcedenteInstance.properties = params;
        if (unidadeConcedenteInstance.save(flush: true)) {
            flash.message="Unidade Concedente atualizada com sucesso.";
            redirect(action: "edit", id: unidadeConcedenteInstance.id);
        }else {
            render(view:"edit",model: [unidadeConcedenteInstance: unidadeConcedenteInstance]);
        }
    };

    def documentos = {
        render(view:"documentos");
    }

    def duvidas = {
        render(view:"duvidas");
    }

    /*
     * Método que verifica se o usuário está logado.
     * Se não estiver logado é redirecionado para home
     */
    private boolean verificaLogon() {
        if(!session["pessoa"]){
            flash.message = "Você precisa estar logado para acessar esta página.";
            redirect(controller:'login', action:'auth');
            return false;
        }

        return true;
    }


}
